home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / varie / uae-0_64.lha / uae-0.6.4 / src / blitter.c < prev    next >
C/C++ Source or Header  |  1996-08-18  |  17KB  |  552 lines

  1.  /*
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * Custom chip emulation
  5.   * 
  6.   * (c) 1995 Bernd Schmidt, Alessandro Bissacco
  7.   */
  8.  
  9. #include "sysconfig.h"
  10. #include "sysdeps.h"
  11.  
  12. #include "config.h"
  13. #include "options.h"
  14. #include "events.h"
  15. #include "memory.h"
  16. #include "custom.h"
  17. #include "newcpu.h"
  18. #include "blitter.h"
  19. #include "blit.h"
  20.  
  21. UWORD bltsize, oldvblts;
  22. UWORD bltcon0,bltcon1;
  23. ULONG bltapt,bltbpt,bltcpt,bltdpt;
  24.  
  25. int blinea_shift;
  26. static UWORD blitlpos, blinea, blineb;
  27. static CPTR bltcnxlpt,bltdnxlpt;
  28. static int blitline,blitfc,blitfill,blitife,blitdesc,blitsing;
  29. static int blitonedot,blitsign;
  30. static long int bltwait;
  31.  
  32. struct bltinfo blt_info;
  33.  
  34. static UBYTE blit_filltable[256][4][2];
  35.  
  36. enum blitter_states bltstate;
  37.  
  38. void build_blitfilltable(void)
  39. {
  40.     unsigned int d, fillmask;
  41.     int i;
  42.     for (d = 0; d < 256; d++) {
  43.     for (i = 0; i < 4; i++) {
  44.         int fc = i & 1;
  45.         UBYTE data = d;
  46.         for (fillmask = 1; fillmask != 0x100; fillmask <<= 1) {
  47.         UWORD tmp = data;
  48.         if (fc) {
  49.             if (i & 2)
  50.             data |= fillmask;
  51.             else
  52.             data ^= fillmask;
  53.         }
  54.         if (tmp & fillmask) fc = !fc;
  55.         }
  56.         blit_filltable[d][i][0] = data;
  57.         blit_filltable[d][i][1] = fc;
  58.     }
  59.     }
  60. }
  61.  
  62. static __inline__ UBYTE *blit_xlateptr(CPTR bltpt, int bytecount)
  63. {
  64.     if (!chipmem_bank.check(bltpt,bytecount)) return NULL;
  65.     return chipmem_bank.xlateaddr(bltpt);
  66. }
  67.  
  68. static __inline__ UBYTE *blit_xlateptr_desc(CPTR bltpt, int bytecount)
  69. {
  70.     if (!chipmem_bank.check(bltpt-bytecount, bytecount)) return NULL;
  71.     return chipmem_bank.xlateaddr(bltpt);
  72. }
  73.  
  74. static void blitter_dofast(void) 
  75. {
  76.     int i,j;
  77.     UBYTE *bltadatpt = 0, *bltbdatpt = 0, *bltcdatpt = 0, *bltddatpt = 0;
  78.     UWORD blitahold, blitbhold, bltaold;
  79.     UBYTE mt = bltcon0 & 0xFF;
  80.     
  81.     if (bltcon0 & 0x800) {
  82.     bltadatpt = blit_xlateptr(bltapt, (blt_info.hblitsize*2+blt_info.bltamod)*blt_info.vblitsize);
  83.     bltapt += (blt_info.hblitsize*2+blt_info.bltamod)*blt_info.vblitsize;
  84.     }
  85.     if (bltcon0 & 0x400) {
  86.     bltbdatpt = blit_xlateptr(bltbpt, (blt_info.hblitsize*2+blt_info.bltbmod)*blt_info.vblitsize);
  87.     bltbpt += (blt_info.hblitsize*2+blt_info.bltbmod)*blt_info.vblitsize;
  88.     }
  89.     if (bltcon0 & 0x200) {
  90.     bltcdatpt = blit_xlateptr(bltcpt, (blt_info.hblitsize*2+blt_info.bltcmod)*blt_info.vblitsize);
  91.     bltcpt += (blt_info.hblitsize*2+blt_info.bltcmod)*blt_info.vblitsize;
  92.     }
  93.     if (bltcon0 & 0x100) {
  94.     bltddatpt = blit_xlateptr(bltdpt, (blt_info.hblitsize*2+blt_info.bltdmod)*blt_info.vblitsize);
  95.     bltdpt += (blt_info.hblitsize*2+blt_info.bltdmod)*blt_info.vblitsize;
  96.     }
  97.     
  98.     if (blitfunc_dofast[mt] && !blitfill) 
  99.         (*blitfunc_dofast[mt])(bltadatpt,bltbdatpt,bltcdatpt,bltddatpt,&blt_info);
  100.     else {
  101.     /*if (!blitfill) fprintf(stderr, "minterm %x not present\n",mt); */
  102.         for (j = 0; j < blt_info.vblitsize; j++) {
  103.         blitfc = !!(bltcon1 & 0x4);
  104.         for (i = 0; i < blt_info.hblitsize; i++) {
  105.             if (bltadatpt) { blt_info.bltadat = (*bltadatpt << 8) | *(bltadatpt + 1); bltadatpt += 2; }
  106.             if (bltbdatpt) { blt_info.bltbdat = (*bltbdatpt << 8) | *(bltbdatpt + 1); bltbdatpt += 2; }
  107.         if (bltcdatpt) { blt_info.bltcdat = (*bltcdatpt << 8) | *(bltcdatpt + 1); bltcdatpt += 2; }
  108.             bltaold = blt_info.bltadat;
  109.             if (i == 0) bltaold &= blt_info.bltafwm;
  110.             if (i== blt_info.hblitsize-1) bltaold &= blt_info.bltalwm;
  111.             blitahold = (((ULONG)blt_info.blitpreva << 16) | bltaold) >> blt_info.blitashift;
  112.             blitbhold = (((ULONG)blt_info.blitprevb << 16) | blt_info.bltbdat) >> blt_info.blitbshift;
  113.             blt_info.bltddat = blit_func(blitahold, blitbhold, blt_info.bltcdat, mt);
  114.             if (blitfill) {
  115.             UWORD d = blt_info.bltddat;
  116.             int ifemode = blitife ? 2 : 0;
  117.             int fc1 = blit_filltable[d & 255][ifemode + blitfc][1];
  118.             blt_info.bltddat = (blit_filltable[d & 255][ifemode + blitfc][0] 
  119.                     + (blit_filltable[d >> 8][ifemode + fc1][0] << 8));
  120.             blitfc = blit_filltable[d >> 8][ifemode + fc1][1];
  121.         }
  122.             blt_info.blitpreva = bltaold; blt_info.blitprevb = blt_info.bltbdat;
  123.             if (blt_info.bltddat) blt_info.blitzero = 0;
  124.             if (bltddatpt) { *bltddatpt = blt_info.bltddat >> 8; *(bltddatpt+1) = blt_info.bltddat; bltddatpt += 2; }
  125.         }
  126.         if (bltadatpt) bltadatpt += blt_info.bltamod;
  127.         if (bltbdatpt) bltbdatpt += blt_info.bltbmod;
  128.         if (bltcdatpt) bltcdatpt += blt_info.bltcmod;
  129.         if (bltddatpt) bltddatpt += blt_info.bltdmod;
  130.         }
  131.     }
  132.     bltstate = BLT_done;
  133. }
  134.  
  135. static void blitter_dofast_desc(void) 
  136. {
  137.     int i,j;
  138.     UBYTE *bltadatpt = 0, *bltbdatpt = 0, *bltcdatpt = 0, *bltddatpt = 0;
  139.     UWORD blitahold, blitbhold, bltaold;
  140.     UBYTE mt = bltcon0 & 0xFF;
  141.     
  142.     if (bltcon0 & 0x800) {
  143.     bltadatpt = blit_xlateptr_desc(bltapt, (blt_info.hblitsize*2+blt_info.bltamod)*blt_info.vblitsize);
  144.     bltapt -= (blt_info.hblitsize*2+blt_info.bltamod)*blt_info.vblitsize;
  145.     }
  146.     if (bltcon0 & 0x400) {
  147.     bltbdatpt = blit_xlateptr_desc(bltbpt, (blt_info.hblitsize*2+blt_info.bltbmod)*blt_info.vblitsize);
  148.     bltbpt -= (blt_info.hblitsize*2+blt_info.bltbmod)*blt_info.vblitsize;
  149.     }
  150.     if (bltcon0 & 0x200) {
  151.     bltcdatpt = blit_xlateptr_desc(bltcpt, (blt_info.hblitsize*2+blt_info.bltcmod)*blt_info.vblitsize);
  152.     bltcpt -= (blt_info.hblitsize*2+blt_info.bltcmod)*blt_info.vblitsize;
  153.     }
  154.     if (bltcon0 & 0x100) {
  155.     bltddatpt = blit_xlateptr_desc(bltdpt, (blt_info.hblitsize*2+blt_info.bltdmod)*blt_info.vblitsize);
  156.     bltdpt -= (blt_info.hblitsize*2+blt_info.bltdmod)*blt_info.vblitsize;
  157.     }
  158.     if (blitfunc_dofast_desc[mt] && !blitfill) 
  159.     (*blitfunc_dofast_desc[mt])(bltadatpt,bltbdatpt,bltcdatpt,bltddatpt,&blt_info);
  160.     else {
  161. /*    if (!blitfill) fprintf(stderr, "minterm %x not present\n",mt);*/
  162.         for (j = 0; j < blt_info.vblitsize; j++) {
  163.         blitfc = !!(bltcon1 & 0x4);
  164.         for (i = 0; i < blt_info.hblitsize; i++) {
  165.         if (bltadatpt) { blt_info.bltadat = (*bltadatpt << 8) | *(bltadatpt + 1); bltadatpt -= 2; }
  166.         if (bltbdatpt) { blt_info.bltbdat = (*bltbdatpt << 8) | *(bltbdatpt + 1); bltbdatpt -= 2; }
  167.         if (bltcdatpt) { blt_info.bltcdat = (*bltcdatpt << 8) | *(bltcdatpt + 1); bltcdatpt -= 2; }
  168.             bltaold = blt_info.bltadat;
  169.             if (i == 0) bltaold &= blt_info.bltafwm;
  170.             if (i== blt_info.hblitsize-1) bltaold &= blt_info.bltalwm;
  171.             blitahold = (((ULONG)bltaold << 16) | blt_info.blitpreva) >> (16-blt_info.blitashift);
  172.             blitbhold = (((ULONG)blt_info.bltbdat << 16) | blt_info.blitprevb) >> (16-blt_info.blitbshift);
  173.             blt_info.bltddat = blit_func(blitahold, blitbhold, blt_info.bltcdat, mt);
  174.             if (blitfill) {
  175.             UWORD d = blt_info.bltddat;
  176.             int ifemode = blitife ? 2 : 0;
  177.             int fc1 = blit_filltable[d & 255][ifemode + blitfc][1];
  178.             blt_info.bltddat = (blit_filltable[d & 255][ifemode + blitfc][0]
  179.                     + (blit_filltable[d >> 8][ifemode + fc1][0] << 8));
  180.             blitfc = blit_filltable[d >> 8][ifemode + fc1][1];
  181.         }
  182.             blt_info.blitpreva = bltaold; blt_info.blitprevb = blt_info.bltbdat;
  183.             if (blt_info.bltddat) blt_info.blitzero = 0;
  184.             if (bltddatpt) { *bltddatpt = blt_info.bltddat >> 8; *(bltddatpt + 1) = blt_info.bltddat; bltddatpt -= 2; }
  185.         }
  186.         if (bltadatpt) bltadatpt -= blt_info.bltamod;
  187.         if (bltbdatpt) bltbdatpt -= blt_info.bltbmod;
  188.         if (bltcdatpt) bltcdatpt -= blt_info.bltcmod;
  189.         if (bltddatpt) bltddatpt -= blt_info.bltdmod;
  190.         }
  191.     }
  192.     bltstate = BLT_done;
  193. }
  194.  
  195. static __inline__ int blitter_read(void)
  196. {
  197.     if (bltcon0 & 0xe00){
  198.     if (!dmaen(DMA_BLITTER)) return 1; /* blitter stopped */
  199.     if (!blitline){
  200.         if (bltcon0 & 0x800) blt_info.bltadat = chipmem_bank.wget(bltapt);
  201.         if (bltcon0 & 0x400) blt_info.bltbdat = chipmem_bank.wget(bltbpt);
  202.     }
  203.     if (bltcon0 & 0x200) blt_info.bltcdat = chipmem_bank.wget(bltcpt);
  204.     }
  205.     bltstate = BLT_work;
  206.     return (bltcon0 & 0xE00) != 0;
  207. }
  208.  
  209. static __inline__ int blitter_write(void)
  210. {
  211.     if (blt_info.bltddat) blt_info.blitzero = 0;
  212.     if ((bltcon0 & 0x100) || blitline){
  213.     if (!dmaen(DMA_BLITTER)) return 1;
  214.     chipmem_bank.wput(bltdpt, blt_info.bltddat);
  215.     }
  216.     bltstate = BLT_next;
  217.     return (bltcon0 & 0x100) != 0;
  218. }
  219.  
  220. static void blitter_blit(void)
  221. {
  222.     UWORD blitahold,blitbhold,blitchold;
  223.     UWORD bltaold;
  224.     
  225.     if (blitdesc) {
  226.     UWORD bltamask = 0xffff;
  227.     
  228.     if (!blitlpos) { bltamask &= blt_info.bltafwm; }
  229.     if (blitlpos == (blt_info.hblitsize - 1)) { bltamask &= blt_info.bltalwm; }
  230.     bltaold = blt_info.bltadat & bltamask;
  231.  
  232.     blitahold = (((ULONG)bltaold << 16) | blt_info.blitpreva) >> (16-blt_info.blitashift);
  233.     blitbhold = (((ULONG)blt_info.bltbdat << 16) | blt_info.blitprevb) >> (16-blt_info.blitbshift);
  234.     blitchold = blt_info.bltcdat;
  235.     } else {
  236.     UWORD bltamask = 0xffff;
  237.     
  238.     if (!blitlpos) { bltamask &= blt_info.bltafwm; }
  239.     if (blitlpos == (blt_info.hblitsize - 1)) { bltamask &= blt_info.bltalwm; }
  240.     bltaold = blt_info.bltadat & bltamask;
  241.  
  242.     blitahold = (((ULONG)blt_info.blitpreva << 16) | bltaold) >> blt_info.blitashift;
  243.     blitbhold = (((ULONG)blt_info.blitprevb << 16) | blt_info.bltbdat) >> blt_info.blitbshift;
  244.     blitchold = blt_info.bltcdat;
  245.     }
  246.     blt_info.bltddat = 0;
  247.     blt_info.bltddat = blit_func(blitahold, blitbhold, blitchold, bltcon0 & 0xFF);
  248.     if (blitfill){
  249.     UWORD fillmask;
  250.     for (fillmask = 1; fillmask; fillmask <<= 1){
  251.         UWORD tmp = blt_info.bltddat;
  252.         if (blitfc) {
  253.         if (blitife)
  254.             blt_info.bltddat |= fillmask;
  255.         else
  256.             blt_info.bltddat ^= fillmask;
  257.         }
  258.         if (tmp & fillmask) blitfc = !blitfc;
  259.     }
  260.     }
  261.     bltstate = BLT_write;
  262.     blt_info.blitpreva = bltaold; blt_info.blitprevb = blt_info.bltbdat;
  263. }
  264.  
  265. static void blitter_nxblit(void)
  266. {
  267.     bltstate = BLT_read;
  268.     if (blitdesc){
  269.     if (++blitlpos == blt_info.hblitsize) {
  270.         if (--blt_info.vblitsize == 0) {
  271.         bltstate = BLT_done;
  272. #if FAST_BLITTER == 0
  273.         custom_bank.wput(0xDFF09C,0x8040);
  274. #endif
  275.         }
  276.         blitfc = bltcon1 & 0x4;
  277.  
  278.         blitlpos = 0;
  279.         if (bltcon0 & 0x800) bltapt -= 2+blt_info.bltamod; 
  280.         if (bltcon0 & 0x400) bltbpt -= 2+blt_info.bltbmod; 
  281.         if (bltcon0 & 0x200) bltcpt -= 2+blt_info.bltcmod; 
  282.         if (bltcon0 & 0x100) bltdpt -= 2+blt_info.bltdmod;
  283.     } else {
  284.         if (bltcon0 & 0x800) bltapt -= 2; 
  285.         if (bltcon0 & 0x400) bltbpt -= 2; 
  286.         if (bltcon0 & 0x200) bltcpt -= 2; 
  287.         if (bltcon0 & 0x100) bltdpt -= 2;        
  288.     }
  289.     } else {
  290.     if (++blitlpos == blt_info.hblitsize) {
  291.         if (--blt_info.vblitsize == 0) { 
  292.         bltstate = BLT_done;
  293. #if FAST_BLITTER == 0
  294.         custom_bank.wput(0xDFF09C,0x8040);
  295. #endif
  296.         }
  297.         blitlpos = 0;
  298.         if (bltcon0 & 0x800) bltapt += 2+blt_info.bltamod; 
  299.         if (bltcon0 & 0x400) bltbpt += 2+blt_info.bltbmod; 
  300.         if (bltcon0 & 0x200) bltcpt += 2+blt_info.bltcmod; 
  301.         if (bltcon0 & 0x100) bltdpt += 2+blt_info.bltdmod;
  302.     } else {
  303.         if (bltcon0 & 0x800) bltapt += 2; 
  304.         if (bltcon0 & 0x400) bltbpt += 2; 
  305.         if (bltcon0 & 0x200) bltcpt += 2; 
  306.         if (bltcon0 & 0x100) bltdpt += 2;
  307.     }
  308.     }
  309. }
  310.  
  311. static __inline__ void blitter_line_incx(void)
  312. {
  313.     if (++blinea_shift == 16) {
  314.     blinea_shift = 0;
  315.     bltcnxlpt += 2;
  316.     bltdnxlpt += 2;
  317.     }
  318. }
  319.  
  320. static __inline__ void blitter_line_decx(void)
  321. {
  322.     if (blinea_shift-- == 0) {
  323.     blinea_shift = 15;
  324.     bltcnxlpt -= 2;
  325.     bltdnxlpt -= 2;
  326.     }
  327. }
  328.  
  329. static __inline__ void blitter_line_decy(void)
  330. {
  331.     bltcnxlpt -= blt_info.bltcmod;
  332.     bltdnxlpt -= blt_info.bltcmod; /* ??? am I wrong or doesn't KS1.3 set bltdmod? */
  333.     blitonedot = 0;
  334. }
  335.  
  336. static __inline__ void blitter_line_incy(void)
  337. {
  338.     bltcnxlpt += blt_info.bltcmod;
  339.     bltdnxlpt += blt_info.bltcmod; /* ??? */
  340.     blitonedot = 0;
  341. }
  342.  
  343. static void blitter_line(void)
  344. {
  345.     UWORD blitahold = blinea >> blinea_shift, blitbhold = blineb & 1 ? 0xFFFF : 0, blitchold = blt_info.bltcdat;
  346.     blt_info.bltddat = 0;
  347.     
  348.     if (blitsing && blitonedot) blitahold = 0;
  349.     blitonedot = 1;
  350.     blt_info.bltddat = blit_func(blitahold, blitbhold, blitchold, bltcon0 & 0xFF);
  351.     if (!blitsign){
  352.     bltapt += (WORD)blt_info.bltamod;
  353.     if (bltcon1 & 0x10){
  354.         if (bltcon1 & 0x8)
  355.             blitter_line_decy();
  356.         else
  357.             blitter_line_incy();
  358.     } else {
  359.         if (bltcon1 & 0x8)
  360.             blitter_line_decx();
  361.         else 
  362.             blitter_line_incx();
  363.     }
  364.     } else {
  365.     bltapt += (WORD)blt_info.bltbmod;
  366.     }
  367.     if (bltcon1 & 0x10){
  368.     if (bltcon1 & 0x4)
  369.         blitter_line_decx();
  370.     else
  371.         blitter_line_incx();
  372.     } else {
  373.     if (bltcon1 & 0x4)
  374.         blitter_line_decy();
  375.     else
  376.         blitter_line_incy();
  377.     }
  378.     blitsign = 0 > (WORD)bltapt;
  379.     bltstate = BLT_write;
  380. }
  381.  
  382. static __inline__ void blitter_nxline(void)
  383. {
  384.     bltcpt = bltcnxlpt;
  385.     bltdpt = bltdnxlpt;
  386.     blineb = (blineb << 1) | (blineb >> 15);
  387.     if (--blt_info.vblitsize == 0) {
  388.     bltstate = BLT_done;
  389. #if FAST_BLITTER == 0
  390.     custom_bank.wput(0xDFF09C,0x8040);
  391. #endif
  392.     } else {
  393.     bltstate = BLT_read;
  394.     }
  395. }
  396.  
  397. static void blit_init(void)
  398. {
  399.     blitlpos = 0;
  400.     blt_info.blitzero = 1; blt_info.blitpreva = blt_info.blitprevb = 0;
  401.     blitline = bltcon1 & 1;
  402.     blt_info.blitashift = bltcon0 >> 12; blt_info.blitbshift = bltcon1 >> 12;
  403.     
  404.     if (blitline) {
  405.     if (blt_info.hblitsize != 2)
  406.         fprintf(stderr, "weird hblitsize in linemode: %d\n", blt_info.hblitsize);
  407.     bltcnxlpt = bltcpt;
  408.     bltdnxlpt = bltdpt;
  409.     blitsing = bltcon1 & 0x2;
  410.     blinea = blt_info.bltadat;
  411.     blineb = (blt_info.bltbdat >> blt_info.blitbshift) | (blt_info.bltbdat << (16-blt_info.blitbshift));
  412. #if 0
  413.     if (blineb != 0xFFFF && blineb != 0)
  414.         fprintf(stderr, "%x %x %d %x\n", blineb, blt_info.bltbdat, blt_info.blitbshift, bltcon1);
  415. #endif
  416.     blitsign = bltcon1 & 0x40; 
  417.     blitonedot = 0;
  418.     } else {
  419.     blitfc = !!(bltcon1 & 0x4);
  420.     blitife = bltcon1 & 0x8;
  421.     blitfill = bltcon1 & 0x18;
  422.     if ((bltcon1 & 0x18) == 0x18) {
  423.         /* Digital "Trash" demo does this; others too. Apparently, no
  424.          * negative effects. */
  425.         static int warn = 1;
  426.         if (warn)
  427.             fprintf(stderr, "warning: weird fill mode (further messages suppressed)\n");
  428.         warn = 0;
  429.     }
  430.     blitdesc = bltcon1 & 0x2;
  431.     if (blitfill && !blitdesc)
  432.         fprintf(stderr, "warning: blitter fill without desc\n");
  433.     }
  434. }
  435.  
  436. static void actually_do_blit(void)
  437. {
  438.     if (blitline) {
  439.     do {
  440.         blitter_read();
  441.         blitter_line();
  442.         blitter_write();
  443.         blitter_nxline();
  444.     } while (bltstate != BLT_done);
  445.     } else {
  446.     /*blitcount[bltcon0 & 0xff]++;  blitter debug */
  447.     if (blitdesc) blitter_dofast_desc();
  448.     else blitter_dofast();
  449.     }
  450. }
  451.  
  452. void blitter_handler(void)
  453. {
  454.     if (!dmaen(DMA_BLITTER)) {
  455.     eventtab[ev_blitter].active = 1;
  456.     eventtab[ev_blitter].oldcycles = cycles;
  457.     eventtab[ev_blitter].evtime = 10 + cycles; /* wait a little */
  458.     return; /* gotta come back later. */
  459.     }
  460.     actually_do_blit();
  461.     
  462.     INTREQ(0x8040);
  463.     eventtab[ev_blitter].active = 0;
  464.     regs.spcflags &= ~SPCFLAG_BLTNASTY;
  465. }
  466.  
  467. void do_blitter(void)
  468. {
  469. #if FAST_BLITTER == 0
  470.     /* I'm not sure all this bltstate stuff is really necessary.
  471.      * Most programs should be OK if the blit is done as soon as BLTSIZE is
  472.      * written to, and the BLTFINISH bit is set some time after that.
  473.      * This code here is nowhere near exact.
  474.      */
  475.     do {    
  476.     switch(bltstate) {
  477.      case BLT_init:
  478.         blit_init();
  479.         bltstate = BLT_read;
  480.         /* fall through */
  481.      case BLT_read:
  482.         if (blitter_read())
  483.             break;
  484.         /* fall through */
  485.      case BLT_work:
  486.         if (blitline)
  487.             blitter_line(); 
  488.         else 
  489.             blitter_blit();
  490.         /* fall through */
  491.      case BLT_write:
  492.         if (blitter_write())
  493.             break;
  494.         /* fall through */
  495.      case BLT_next:
  496.         if (blitline)
  497.             blitter_nxline();
  498.         else 
  499.             blitter_nxblit();
  500.         break;
  501.      case BLT_done:
  502.         regs.spcflags &= ~SPCFLAG_BLIT;
  503.         break;
  504.     }
  505.     } while(bltstate != BLT_done && dmaen(DMA_BLITTER)
  506.         && dmaen(DMA_BLITPRI));  /* blitter nasty -> no time for CPU */
  507. #else
  508.     {
  509. #if FAST_BLITTER < 4
  510.     long int blit_cycles = 2;
  511.  
  512.     if (!blitline) {
  513.         if (bltcon0 & 0x400)
  514.         blit_cycles++;
  515.         if ((bltcon0 & 0x300) == 0x300)
  516.         blit_cycles++;
  517.         blit_cycles *= blt_info.vblitsize * blt_info.hblitsize;
  518.     }
  519. #else
  520.     long int blit_cycles = 1;
  521. #endif
  522.     blit_init();
  523.     
  524.     eventtab[ev_blitter].active = 1;
  525.     eventtab[ev_blitter].oldcycles = cycles;
  526.     eventtab[ev_blitter].evtime = blit_cycles + cycles;
  527.     events_schedule();
  528.  
  529.     regs.spcflags &= ~SPCFLAG_BLIT;
  530.     if (dmaen(DMA_BLITPRI))
  531.         regs.spcflags |= SPCFLAG_BLTNASTY;
  532.     }
  533. #endif
  534. }
  535.  
  536. void maybe_blit(void)
  537. {
  538.     static int warned = 0;
  539.     if (bltstate == BLT_done)
  540.     return;
  541.     
  542.     if (!warned) {
  543.     warned = 1;
  544.     fprintf(stderr, "warning: Program does not wait for blitter (no further messages)\n");
  545.     }
  546.     if (!eventtab[ev_blitter].active)
  547.     printf("FOO!!?\n");
  548.     actually_do_blit();
  549.     eventtab[ev_blitter].active = 0;
  550.     regs.spcflags &= ~SPCFLAG_BLTNASTY;
  551. }
  552.